﻿// seejee_Backendium.WEB.Controllers/AccController.cs
using Microsoft.AspNetCore.Mvc;
using seejee_Backendium.Core.Interfaces;
using seejee_Backendium.Core.Models;
using System.ComponentModel.DataAnnotations;

namespace seejee_Backendium.WEB.Controllers
{
    [ApiController]
    [Route("api/[controller]")] // 路由：api/Acc
    public class AccController : ControllerBase
    {
        private readonly ILogger<AccController> _logger;
        private readonly IAccService _accService;

        // 构造函数修复：正确赋值_logger
        public AccController(ILogger<AccController> logger, IAccService accService)
        {
            _logger = logger;
            _accService = accService;
        }

        #region 1. 查询操作
        /// <summary>
        /// 获取所有数据源记录
        /// </summary>
        /// <returns>所有记录列表</returns>
        [HttpGet("all")] // 路由：api/Acc/all
        public async Task<ActionResult<IEnumerable<AccModel>>> GetAllAccList()
        {
            try
            {
                var result = await _accService.GetAllAsync();
                return Ok(result); // 无论空/非空，均返回200+数据（空集合也比404更合理）
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取所有数据源记录失败");
                return StatusCode(500, "服务器内部错误：获取数据失败");
            }
        }

        /// <summary>
        /// 根据主键cid获取单条数据源记录
        /// </summary>
        /// <param name="cid">主键ID（必须大于0）</param>
        /// <returns>单条记录或404</returns>
        [HttpGet("{cid:int}")] // 路由：api/Acc/1（仅允许int类型cid）
        public async Task<ActionResult<AccModel>> GetAccByCid([FromRoute, Range(1, int.MaxValue)] int cid)
        {
            try
            {
                var result = await _accService.GetByIdAsync(cid);
                if (result == null)
                {
                    _logger.LogWarning("未找到cid为[{0}]的数据源记录", cid);
                    return NotFound($"未找到cid={cid}的记录");
                }
                return Ok(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "获取cid[{0}]的数据源记录失败", cid);
                return StatusCode(500, "服务器内部错误：获取单条数据失败");
            }
        }

        /// <summary>
        /// 用户登录验证（根据用户名+密码查询）
        /// </summary>
        /// <param name="userName">用户名（非空，最大长度50）</param>
        /// <param name="password">密码（非空，最大长度50）</param>
        /// <returns>匹配的用户记录</returns>
        [HttpGet("login")] // 路由：api/Acc/login?userName=xxx&password=xxx
        public async Task<ActionResult<IEnumerable<AccModel>>> Login(
            [FromQuery, Required, MaxLength(50)] string userName,
            [FromQuery, Required, MaxLength(50)] string password)
        {
            try
            {
                var result = await _accService.GetByCusNameAsync(userName, password);
                return Ok(result); // 若无匹配记录，返回空集合（前端可判断是否登录成功）
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "用户[{0}]登录验证失败", userName);
                return StatusCode(500, "服务器内部错误：登录验证失败");
            }
        }
        #endregion

        #region 2. 新增操作
        /// <summary>
        /// 新增数据源记录
        /// </summary>
        /// <param name="model">新增的记录数据（cid无需传递，自动生成）</param>
        /// <returns>新增的记录（含自动生成的cid）</returns>
        [HttpPost] // 路由：api/Acc（POST请求）
        public async Task<ActionResult<AccModel>> AddAcc([FromBody] AccModel model)
        {
            try
            {
                // 1. 模型验证（基于实体类字段长度限制）
                if (!ModelState.IsValid)
                {
                    _logger.LogWarning("新增数据源记录：模型验证失败（{0}）", string.Join(";", ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))));
                    return BadRequest(ModelState); // 返回具体验证错误
                }

                // 2. 调用服务层新增（cid会自动生成，无需传递）
                var newCid = await _accService.AddAsync(model);
                if (newCid <= 0)
                {
                    _logger.LogError("新增数据源记录失败（用户名：{0}）");
                    return BadRequest("新增失败：服务器未生成有效cid");
                }

                // 3. 返回新增的完整记录（含cid）
                var newModel = await _accService.GetByIdAsync(newCid);
                return CreatedAtAction(nameof(GetAccByCid), new { cid = newCid }, newModel); // 201+Location头
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "新增数据源记录失败（用户名：{0}）");
                return StatusCode(500, "服务器内部错误：新增数据失败");
            }
        }
        #endregion

        #region 3. 修改操作
        /// <summary>
        /// 修改数据源记录（根据cid匹配）
        /// </summary>
        /// <param name="cid">路由中的cid（必须与请求体中的cid一致）</param>
        /// <param name="model">修改后的记录数据（必须包含cid）</param>
        /// <returns>无返回体（204）或错误信息</returns>
        [HttpPost("{cid:int}")] // 路由：api/Acc/1（PUT请求）
        public async Task<IActionResult> UpdateAcc(
            [FromRoute, Range(1, int.MaxValue)] int cid,
            [FromBody] AccModel model)
        {
            try
            {
                // 1. 校验cid一致性
                if (cid != model.cid)
                {
                    _logger.LogWarning("修改数据源记录：路由cid[{0}]与请求体cid[{1}]不一致", cid);
                    return BadRequest("路由中的cid必须与请求体中的cid一致");
                }

                // 2. 模型验证
                if (!ModelState.IsValid)
                {
                    _logger.LogWarning("修改数据源记录（cid：{0}）：模型验证失败", cid);
                    return BadRequest(ModelState);
                }

                // 3. 校验记录是否存在
                var existingModel = await _accService.GetByIdAsync(cid);
                if (existingModel == null)
                {
                    _logger.LogWarning("修改数据源记录：未找到cid为[{0}]的记录", cid);
                    return NotFound($"未找到cid={cid}的记录，无法修改");
                }

                // 4. 调用服务层修改
                var isSuccess = await _accService.UpdateAsync(model);
                if (!isSuccess)
                {
                    _logger.LogError("修改数据源记录失败（cid：{0}）", cid);
                    return BadRequest("修改失败：未找到匹配记录或数据无变化");
                }

                return NoContent(); // 204：修改成功，无返回体
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "修改数据源记录失败（cid：{0}）", cid);
                return StatusCode(500, "服务器内部错误：修改数据失败");
            }
        }
        #endregion

        #region 4. 删除操作
        /// <summary>
        /// 根据cid删除数据源记录
        /// </summary>
        /// <param name="cid">主键ID（必须大于0）</param>
        /// <returns>无返回体（204）或错误信息</returns>
        [HttpDelete("{cid:int}")] // 路由：api/Acc/1（DELETE请求）
        public async Task<IActionResult> DeleteAcc([FromRoute, Range(1, int.MaxValue)] int cid)
        {
            try
            {
                // 1. 校验记录是否存在
                var existingModel = await _accService.GetByIdAsync(cid);
                if (existingModel == null)
                {
                    _logger.LogWarning("删除数据源记录：未找到cid为[{0}]的记录", cid);
                    return NotFound($"未找到cid={cid}的记录，无法删除");
                }

                // 2. 调用服务层删除
                var isSuccess = await _accService.DeleteAsync(cid);
                if (!isSuccess)
                {
                    _logger.LogError("删除数据源记录失败（cid：{0}）", cid);
                    return BadRequest("删除失败：服务器未执行删除操作");
                }

                return NoContent(); // 204：删除成功，无返回体
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "删除数据源记录失败（cid：{0}）", cid);
                return StatusCode(500, "服务器内部错误：删除数据失败");
            }
        }
        #endregion

        [HttpPost("state/{cid:int}")] // 路由：api/Acc/1（PUT请求）
        public async Task<IActionResult> UpdateAccState(
        [FromRoute, Range(1, int.MaxValue)] int cid,
        [FromBody] StateUpdateDto dto)
        {
            try
            {
                // 1. 校验cid一致性
                if (cid != dto.cid)
                {
                    _logger.LogWarning("修改数据源记录：路由cid[{0}]与请求体cid[{1}]不一致", cid);
                    return BadRequest("路由中的cid必须与请求体中的cid一致");
                }

                // 2. 模型验证
                if (!ModelState.IsValid)
                {
                    _logger.LogWarning("修改数据源记录（cid：{0}）：模型验证失败", cid);
                    return BadRequest(ModelState);
                }

                // 3. 校验记录是否存在
                var existingModel = await _accService.GetByIdAsync(cid);
                if (existingModel == null)
                {
                    _logger.LogWarning("修改数据源记录：未找到cid为[{0}]的记录", cid);
                    return NotFound($"未找到cid={cid}的记录，无法修改");
                }

                // 4. 调用服务层修改
                var isSuccess = await _accService.UpdateStateAsync(cid, dto.State);
                if (!isSuccess)
                {
                    _logger.LogError("修改数据源记录失败（cid：{0}）", cid);
                    return BadRequest("修改失败：未找到匹配记录或数据无变化");
                }

                return NoContent(); // 204：修改成功，无返回体
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "修改数据源记录失败（cid：{0}）", cid);
                return StatusCode(500, "服务器内部错误：修改数据失败");
            }
        }
    }
}